package com.wongoing.util;

import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NumberUtil {
    private static final int DEF_DIV_SCALE = 10;  
		
    	/**
		 * 功能说明：数据格式话，返回字符串
		 * 修改说明：
		 * @author 吴兆强
		 * @date 2017-8-30 下午3:36:29
		 * @param d double型数据
		 * @param comma
		 * @return
		 */
	    public static String format(double d,boolean comma) {
	        NumberFormat nf = NumberFormat.getInstance();
	        // 是否以逗号隔开, 默认true以逗号隔开,如[123,456,789.128]
	        nf.setGroupingUsed(comma);
	        // 结果未做任何处理
	        return nf.format(d);
	    }
	    
    	/**
		 * 功能说明：数据格式话，返回字符串
		 * 修改说明：
		 * @author 吴兆强
		 * @date 2017-8-30 下午3:36:29
		 * @param d float型数据
		 * @param comma
		 * @return
		 */
	    public static String format(float d,boolean comma) {
	        NumberFormat nf = NumberFormat.getInstance();
	        // 是否以逗号隔开, 默认true以逗号隔开,如[123,456,789.128]
	        nf.setGroupingUsed(comma);
	        // 结果未做任何处理
	        return nf.format(d);
	    }
	    
	    /**
	     * 功能说明：数字保留指定位数，返回字符串
	     * 修改说明：
	     * @author 吴兆强
	     * @date 2017-8-30 下午3:37:37
	     * @param num double
	     * @param scale
	     * @return
	     */
	    public static String format(double num,int scale) {
	        BigDecimal intput = new BigDecimal(Double.toString(num));
	        BigDecimal divisor = new BigDecimal(Integer.toString(1));
	        // 四舍五入,保留2位小数
	        return intput.divide(divisor,scale,BigDecimal.ROUND_HALF_UP).toString();
	    }
	    
	    /**
	     * 功能说明：数字保留指定位数，返回字符串
	     * 修改说明：
	     * @author 吴兆强
	     * @date 2017-8-30 下午3:37:37
	     * @param num double
	     * @param scale
	     * @return
	     */
	    public static String format(float num,int scale) {
	        BigDecimal intput = new BigDecimal(Double.toString(num));
	        BigDecimal divisor = new BigDecimal(Integer.toString(1));
	        // 四舍五入,保留2位小数
	        return intput.divide(divisor,scale,BigDecimal.ROUND_HALF_UP).toString();
	    }

	    /**
	     * 功能说明：判断是否为数字（正则）
	     * 修改说明：
	     * @author 吴兆强
	     * @date 2017-8-30 下午3:38:31
	     * @param str
	     * @return
	     */
	    public static boolean isNumeric(String str){ 
	    	   Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]+"); 
	    	   Matcher isNum = pattern.matcher(str);
	    	   if( !isNum.matches() ){
	    	       return false; 
	    	   } 
	    	   return true; 
	    	}

	    
	    /** 
	    * * 两个Double数相加 * 
	    *  
	    * @param v1 * 
	    * @param v2 * 
	    * @return Double 
	    */  
	    public static Double add(Double v1, Double v2) {  
	       BigDecimal b1 = new BigDecimal(v1.toString());  
	       BigDecimal b2 = new BigDecimal(v2.toString());  
	       return new Double(b1.add(b2).doubleValue());  
	    }  
	      
	    /** 
	    * * 两个Double数相减 * 
	    *  
	    * @param v1 * 
	    * @param v2 * 
	    * @return Double 
	    */  
	    public static Double sub(Double v1, Double v2) {  
	       BigDecimal b1 = new BigDecimal(v1.toString());  
	       BigDecimal b2 = new BigDecimal(v2.toString());  
	       return new Double(b1.subtract(b2).doubleValue());  
	    }  
	      
	    /** 
	    * * 两个Double数相乘 * 
	    *  
	    * @param v1 * 
	    * @param v2 * 
	    * @return Double 
	    */  
	    public static Double mul(Double v1, Double v2) {  
	       BigDecimal b1 = new BigDecimal(v1.toString());  
	       BigDecimal b2 = new BigDecimal(v2.toString());  
	       return new Double(b1.multiply(b2).doubleValue());  
	    }  
	      
	    /** 
	    * * 两个Double数相除 * 
	    *  
	    * @param v1 * 
	    * @param v2 * 
	    * @return Double 
	    */  
	    public static Double div(Double v1, Double v2) {  
	       BigDecimal b1 = new BigDecimal(v1.toString());  
	       BigDecimal b2 = new BigDecimal(v2.toString());  
	       return new Double(b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP)  
	         .doubleValue());  
	    }  
	      
	    /** 
	    * * 两个Double数相除，并保留scale位小数 * 
	    *  
	    * @param v1 * 
	    * @param v2 * 
	    * @param scale * 
	    * @return Double 
	    */  
	    public static Double div(Double v1, Double v2, int scale) {  
	       if (scale < 0) {  
	        throw new IllegalArgumentException(  
	          "The scale must be a positive integer or zero");  
	       }  
	       BigDecimal b1 = new BigDecimal(v1.toString());  
	       BigDecimal b2 = new BigDecimal(v2.toString());  
	       return new Double(b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue());  
	    }  
	    
	    /**
		 * 函数功能说明 TODO:求数组中最小值 
		 * 作者：yuany 
		 * 日期：2016-7-15 11:29:01 修改内容
		 * 
		 * @Title: getArrMin
		 * @Description:
		 * @param array
		 *            数组
		 * @param @throws Exception 设定文件
		 * @return double 返回类型
		 * @throws
		 */
		public static Double getArrMin(Double[] array) {
			Double min = array[0];
			for (int i = 0; i < array.length; i++) {
				if (min > array[i])
					min = array[i];
			}
			return min;
		}

		/**
		 * 函数功能说明 TODO:求数组中最大值
		 * 作者：yuany 
		 * 日期：2016-7-15 11:29:01 修改内容
		 * 
		 * @Title: getArrMax
		 * @Description:
		 * @param array
		 *            数组
		 * @param @throws Exception 设定文件
		 * @return double 返回类型
		 * @throws
		 */
		public static Double getArrMax(Double[] array) {
			Double max = array[0];
			for (int i = 0; i < array.length; i++) {
				if (max < array[i])
					max = array[i];
			}
			return max;
		}

		/**
		 * 功能说明：数字格式化，默认保留5位
		 * 修改说明：
		 * @author 吴兆强
		 * @date 2017-8-30 下午3:39:17
		 * @param d
		 * @return
		 */
		public static Double doubleFormat(Double d) {
			BigDecimal b = new BigDecimal(d);
			Double formatD = b.setScale(5, BigDecimal.ROUND_HALF_UP).doubleValue();
			return formatD;
		}
		
		/**
		 * 功能说明：数字格式化，指定位数
		 * 修改说明：
		 * @author 吴兆强
		 * @date 2017-8-30 下午3:39:38
		 * @param digits
		 * @param d
		 * @return
		 */
		public static Double doubleFormat(int digits,Double d) {
			BigDecimal b = new BigDecimal(d);
			Double formatD = b.setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
			return formatD;
		}
		
		/**
		 * 功能说明：数字格式化，默认保留5位
		 * 修改说明：
		 * @author 吴兆强
		 * @date 2017-8-30 下午3:39:17
		 * @param d
		 * @return
		 */
		public static Float format(Float f) {
			BigDecimal b = new BigDecimal(f);
			Float formatF = b.setScale(5, BigDecimal.ROUND_HALF_UP).floatValue();
			return formatF;
		}
		
		/**
		 * 功能说明：数字格式化，指定位数
		 * 修改说明：
		 * @author 吴兆强
		 * @date 2017-8-30 下午3:39:38
		 * @param digits
		 * @param d
		 * @return
		 */
		public static Float format(int digits,Float f) {
			BigDecimal b = new BigDecimal(f);
			Float formatF = b.setScale(digits, BigDecimal.ROUND_HALF_UP).floatValue();
			return formatF;
		}

}
